package io.spring.sample.graphql.repository;



import io.spring.sample.graphql.jpa.*;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.graphql.data.GraphQlRepository;

import java.util.UUID;

/*
 没有基础实现类的话 不可以加上,ExtendedJpaRepository<Unit, UUID>报错，得改成, JpaRepository<Unit, UUID>，所以能用基础的就尽量不用定义成ExtendedJpaRepository；
 QuerydslNcExecutor加上也不会报错。
 上注解@GraphQlRepository后 unitRepository(uinput:UnitInputPorjection): [Unit]其实完全不需要自己写代码，有默认参数注入自动的查询接口方式的；没法自动处理分页！
 */
@GraphQlRepository
public interface Units extends ProjectionRepository<Unit, UUID>,QuerydslNcExecutor<Unit>, JpaRepository<Unit, UUID>
{
    //也不能随便写的 Slice<Unit> comeHiAll(Predicate predicate, Pageable pageable);   , ExtendedJpaRepository<Unit, UUID>
//无法这样写！  <T> Slice<T> readAllBy(Predicate predicate,Pageable pageable,Class<T> type);  根本没法运行，自动生成代码的？？。
  //ProjectionRepository已经声明的按名字自动生成代码的函数{和QuerydslPredicateExecutor不是一条路子的}，这里可以不用再次声明了。
    //<P> Slice<P>  readAllBy(Predicate predicate, Pageable pageable, Class<P> type); 参数无法注入，和QuerydslPredicateExecutor不是一条路子的。

    //interface UnitRepository extends 后面接口继承若没有声明count(Predicate predicate)就无法编译，但是允许单独在本接口内自主定义，实现类还是依旧可以调用如常。
 //   long count(Predicate predicate);
    //<T> Page<T> findAll(Predicate predicate, Pageable pageable, Class<T> type); 报错No property 'findAll' found for type 'Unit'!
    //报错： <T> Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable, Class<T> type);按名字自动生成代码方案，参数不能随意。
}



/*@GraphQlRepository
//@Repository
@Transactional
public class UnitRepository {
        private static final QUnit q = QUnit.unit;
        private static final QBean<Unit> PROJECTION = Projections.bean(Unit.class,
                q.id, q.unit);

        @PersistenceContext
        private EntityManager entityManager;
        public Slice<Unit> findAll(Predicate predicate, Pageable pageable) {
            return new Queryable<Unit>(Unit.class, entityManager)
                    .findAll(PROJECTION, predicate, pageable);
        }
}*/


/*
        ,
        QuerydslBinderCustomizer<QUnit> {

    Unit findUnitByPerson_Id(UUID id);
    Unit findUnitByCompany_Id(UUID id);
    Unit findUnitByPerson(Person person);
    Unit findUnitByCompany(Company company);
    Unit findUnitByCompany_Name(String companyName);
    Unit findUnitByCompany_No(String companyNo);

    @Override
    default void customize(QuerydslBindings bindings, QUnit qUnit) {
        bindings.bind(qUnit.company.name).first(
                (path, value) -> path.isNull().or(path.startsWithIgnoreCase(value))
        );
        bindings.bind(qUnit.person.name).first((path, value) ->
                path.isNull().or(path.startsWithIgnoreCase(value))
        );
        bindings.bind(String.class).first(
         (StringPath path, String value) -> path.isNull().or(path.containsIgnoreCase(value))
        );
    }

}
*/



/*
graphql不允许混用Object实体模型输出和接口参数输入的结构体类型，必须额外定义Input：何必呢。CompanyInput完全不在java代码中出现也行啊。update(input: SalaryInput!): SalaryPayload
 graphql.schema.idl.errors.NotAnInputTypeError: The type 'Adminunit' [@1:1] is not an input type, but was used as an input type [@96:9]
这样interface UnitRepository extends JpaRepository<Unit, UUID>, QueryableReadRepository<Unit,UUID>, CustomQueryDslPredicateExecutor<Unit>一直无法进入自定义函数！
舍去后面的 , CustomQueryDslPredicateExecutor<Unit>就可以了：多个interface都有同样的函数，为何优先采用父类？
ResponseEntity<List<Employee>> listEmployees(@QuerydslPredicate(root = Employee.class) Predicate predicate) {
    List<Employee> employees = employeeService.listEmployees(predicate);
    return new ResponseEntity<>(employees , HttpStatus.OK);
} ？ Querydsl Web Support 支持 query string: ?firstname=Dave&lastname=Matthews

*/
